使用Dagger2进行方法注射

您所在的位置:网站首页 ioc 注入 使用Dagger2进行方法注射

使用Dagger2进行方法注射

#使用Dagger2进行方法注射| 来源: 网络整理| 查看: 265

我没有设法使用Dagger 2找到关于方法注入的好解释/示例.有人可以帮我理解吗?

例:

@Inject public Dinner makeDinner(Pasta pasta, Sauce sauce) { mPan.add(pasta); mPan.add(sauce); return mPan.cookDinner(); }

因此,如果我用我的方法注释@Inject,我是否正确假设方法签名中的参数将从对象图中注入定义的对象?我如何在我的代码中使用此方法呢?当我进行方法调用时,它仍然期望我提供所有参数,这会破坏目的.

更新:

因此,根据我的理解,如果我打电话DinnerComponent.dinner(),可以使用Dinner对象,假设我的DinnerComponent设置如下:

@Component(modules = DinnerModule.class) public interface DinnerComponent { Dinner dinner(); }

我的DinnerModule设置如下:

@Module public class DinnerModule { public DinnerModule() {} @Provides Pasta providePasta() { return new Pasta(); } @Provides Sauce provideSauce() { return new Sauce(); } }

如果我想要我的晚餐炒得怎么样?那么让我们介绍一下这个方法:

@Inject public Dinner makeDinner(Pasta pasta, Sauce sauce) { mPan.add(pasta); mPan.add(sauce); return mPan.fryDinner(); }

如何在组件内指定哪种晚餐是哪种?

1> Jeff Bowman ..:

与您使用它的方式不同的方法注入的一个基本区别是,方法注入只是Dagger在构造或注入DI就绪对象时发送依赖关系的另一种方式,这意味着@Inject-annotated方法是意思是Dagger在构造时调用,而不是在你自己的代码中调用.这使得您不太可能 - @Inject注释makeDinner,fryDinner或任何其他具有有意义的副作用或返回值的方法.相反,将方法注入视为构造函数式注入的事后机会.

public class Chef { private Provider mPastaProvider; private Sauce mSauce; @Inject public void registerIngredients( // can be named anything Provider pastaProvider, Sauce sauce) { // T and Provider both work, of course mPastaProvider = pastaProvider; mSauce = sauce; } /* Non-@Inject */ public Dinner cookDinner() { mPan.add(mPastaProvider.get()); mPan.add(mSauce); return mPan.cookDinner(); } /* Non-@Inject */ public Dinner fryDinner() { mPan.add(mPastaProvider.get()); mPan.add(mSauce); return mPan.fryDinner(); } }

在这种情况下,当您向Chef请求注入时,Dagger将看到@Inject-annotated方法并调用它.除非您有@Inject-annotated构造函数或@Provides方法,否则您将无法直接从Component获取Chef,但您可以void在Component上创建一个接收构造Chef实例的方法,该方法使用字段和方法注入为厨师提供他们可能需要的成分(或成分供应商).(有关详细信息,请参阅@Component和MembersInjector文档.)

请注意,在任何情况下都不会Dinner出现在对象图上!将@Inject添加到构造函数告诉Dagger它可以使用该构造函数使对象在对象图上可用,但是将@Inject添加到方法或字段只是告诉Dagger作为注入过程的一部分它应该填充该字段或调用具有给定依赖关系的方法.如果要在对象图上提供晚餐,则需要@Inject-annotate Dinner构造函数,或者将@Provides或@Binds方法放在您提供给Component的模块中.

你为什么要用这个?考虑以反射方式创建对象的情况(例如Android中的"活动","片段"和"视图"或"可序列化对象"),您不希望公开@Inject字段.在这些情况下,您可以通过在字段上进行注入来解决构造函数约束.类似地,虽然我没有尝试过这个,你可以利用类层次结构来标记一个带@Inject的接口方法,确保你是否在DI上下文中,你可以将某些依赖项传递给一个对象作为他们的一部分.制备.

在多次阅读这个答案并为自己尝试之后,我想我终于可以快速进行方法注入了.谢谢!

2> Egor Neliuba..:

注释一个方法,@Inject给出Dagger指令,在对象创建后立即执行此方法 - 在构造函数调用之后.当您需要完全构造的对象时,这非常有用.有一个在注射方法的一个例子在本文.

你是对的,说这个方法的参数将由Dagger提供,这就是为什么你不应该自己调用这个方法.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3